from tkinter import *
import webbrowser

#定义类继承于画纸对象
class Application(Frame):
    '''经典的GUI程序类的写法'''
    def __init__(self,master=None):# master模板容器，画纸放到哪
        # 继承方法，父类的重新定义
        super().__init__(master) # 定义属性
        self.master = master
        self.pack() # 画纸几何布局，默认摆放
        self.CreatWidget() # 创建示例对象时，自动进行调用

    def CreatWidget(self):
        '''创建组件'''
        # 文本框的高度、宽度及背景色
        self.w1 = Text(root,width=40,height=12,bg='gray')
        self.w1.pack()

        # 在文本框里插入内容
        # INSERT 表示光标当前的位置，END表示结尾的位置
        # self.w1.insert(INSERT,'hello')
        # self.w1.insert(END,'world')    # 在文本框中输入hello world

        # 小数点代表  行.列，插入到第几行第几列后的位置
        self.w1.insert(1.0,'1234567890\nabcdefg')
        self.w1.insert(2.3,'今天上课很开心\n')

        Button(self, text='重复插入文本', command=self.insertText).pack(side='left')
        Button(self, text='返回文本', command=self.returnText).pack(side='left')
        Button(self, text='添加图片', command=self.addImage).pack(side='left')
        Button(self, text='添加组件', command=self.addWidget).pack(side='left')
        Button(self, text='通过tag精确控制文本', command=self.testTag).pack(side='left')

    def insertText(self):
        # INSERT 在光标位置处插入
        self.w1.insert(INSERT,' 你好啊 ')
        # END 在最后面插入
        self.w1.insert(END,'好好学习')
        # 在第一行第八列后插入
        self.w1.insert(1.8,'图形编程')

    def returnText(self):
        # Indexes(索引)是⽤来指向 Text 组件中⽂本的位置，Text 的组件索引也是对应实际字符之间的位置。
        # 核⼼：⾏号以 1 开始 列号以 0 开始
        # 获取第一行第三列到第六列的内容，截取文本，左闭右开
        print(self.w1.get(1.2, 1.6)) # 3456
        print("所有⽂本内容：\n" + self.w1.get(1.0, END))

    def addImage(self):
        # global photo
        self.photo = PhotoImage(file="C:\\Users\\vio\\Downloads\\Over 4M Pixel jpeg & png_Notebook_PC_1.png")
        # 文本框内插入图片
        self.w1.image_create(END, image=self.photo)

    def addWidget(self):
        # 添加按钮，并没有command绑定功能，点击后没反应
        b1 = Button(self.w1, text='编程语言')
        # 在 text 创建组件的命令，在光标处
        self.w1.window_create(INSERT, window=b1)

    def testTag(self):  # 精确控制
        self.w1.delete(1.0, END)  # 清除文本框内容
        # 插入新的内容
        self.w1.insert(INSERT, "good good study,day day up!\n好好学习\n程序猿\n百度，搜⼀下就知道")
        # 文本标记，添加设置，定位到第一行的第一列到第九列
        # good baidu 是传入的参数，用于定位 ，无任何意义
        self.w1.tag_add("good", 1.0, 1.9)
        self.w1.tag_config("good", background="yellow", foreground="red")
        self.w1.tag_add("baidu", 4.0, 4.2)
        self.w1.tag_config("baidu", underline=True)
        # 绑定时间
        self.w1.tag_bind("baidu", "<Button-1>", self.webshow)

    def webshow(self, event):
        # 点击后，访问网站，超链接
        webbrowser.open("http://www.baidu.com")

if __name__ == '__main__': # 程序入口，里面的本文件内调用，其他程序访问不到
    root = Tk() # 创建主窗口
    root.title('标题-经典GUI程序类的测试')
    root.geometry('500x500+900+300')

    # 创建画纸对象放到root画板上
    Application(master=root)
    root.mainloop()  # 消息循环
